package __数组

import "math"

/*
https://leetcode.cn/problems/minimum-size-subarray-sum/

209. 长度最小的连续子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ，
并返回其长度。如果不存在符合条件的子数组，返回 0 。

给定一个含有 n个正整数的数组和一个正整数 target,
找出该数组中满足其它总和大于等于 target的长度最小的 连续子数组

示例 1：
输入：target = 7, nums = [2,3,1,2,4,3]
输出：2
解释：子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2：
输入：target = 4, nums = [1,4,4]
输出：1

示例 3：
输入：target = 11, nums = [1,1,1,1,1,1,1,1]
输出：0

思路:
暴力解法使用两层for循环, 枚举所有组合, 并判断和为target和长度是否为最小

本题使用滑动窗口进行解决
for j=0; j<=nums.size; j++ {   //j表示符合题意标准的子数组的尾部

		sum +=  num[j]  //sum进行累加工作
		if sum >= target {  //如果当前子数组已经达到target值, 那么计算长度并更新结果长度    result初始化的时候,取整数最大值, 这样更新比较取min的时候才保证正确性
			sunL = j-i+1
			result = min(result, subL)

			//起始位置向后移动一位
			sum = sum - num[i]   //sum减去起始位置的值, 并且i++
			i++
		}
	}
*/
func minSubArrayLen(target int, nums []int) int {
	left := 0
	n := len(nums)        // 数组长度
	sum := 0              // 子数组之和
	result := math.MaxInt // 初始化返回长度为l+1，目的是为了判断“不存在符合条件的子数组，返回0”的情况

	for right := 0; right < n; right++ { //遍历参数数组
		sum += nums[right] //计算当前总和

		for sum >= target { //只要总和已经达到了目标和, 就继续执行for循环
			curLen := right - left + 1 //本轮作为符合条件数组的长度
			if curLen < result {       //更新结果
				result = curLen
			}

			sum -= nums[left] //将起始位置向后移动一位
			left++
		}
	}

	//判断初始化结果是否被修改了, 如何都没发生修改, 说明一个符合条件的子数组都没找到, 返回0
	if result == math.MaxInt {
		return 0
	} else {
		return result
	}
}
